﻿//统一文件为utf-8编码编译
#pragma execution_character_set("utf-8")
///////////////////////////////////////////////////////////////////////////
// 文件名:     progressmanage.h
// 描述:
// 作者:      颜磊
// 创建时间:   2024-06-08 23:42
///////////////////////////////////////////////////////////////////////////
#ifndef PROGRESSMANAGE_H
#define PROGRESSMANAGE_H

#include "string"
#include "windows.h"
#include <tlhelp32.h>    //进程快照函数头文件
#include <psapi.h>
#include <assert.h>
#include <map>
#include <list>

#pragma comment(lib,"OleAut32.lib")
#pragma comment(lib,"comsuppw.lib")
#pragma comment(lib,"Userenv.lib")
#pragma comment(lib,"Advapi32.lib")

using namespace std;

struct LastTime{
    int64_t last_time;
    int64_t last_system_time;
};

class ProgressManage
{
public:
    ProgressManage();
    //检测进程是否存在（通过进程名）
    bool checkProcessByName(string &strExe);
    //检测进程是否存在（通过进程Id）
    bool checkProcessById(DWORD &processId);
    //根据进程名获取进程id
    bool getProcessIdByName(string &strExe,DWORD &processId);
    //获取winlogon进程id
    bool getWinlogonProcessId(DWORD &processId);
    //提升当前进程权限
    void enableDebugPriv();
    //根据进程地址获取进程id
    bool getProcessIdByPath(string &proPath,DWORD &processId);
    //根据进程地址获取进程id集合
    list<DWORD> getProcessIdsByPath(string &proPath);
    //根据进程id获取进程名
    string getProcessNameById(DWORD &processId);
    //根据进程id获取运行时长(秒)
    bool  getProcessTimeById(DWORD &processId, uint64_t &time);
    //结束指定进程
    void killProcessById(DWORD &processId);

    // 获取进程的cpu使用率，返回-1失败
    bool get_cpu_usage(DWORD &processId,float &cpu_usage);

    // 获取进程内存和虚拟内存使用量，返回-1失败，0成功
    bool get_memory_usage(DWORD &processId,uint64_t& mem, uint64_t& vmem);

    // 获取进程总共读和写的IO字节数，返回-1失败，0成功
    bool get_io_bytes(DWORD &processId,uint64_t& read_bytes, uint64_t& write_bytes);

    //服务程序启动外部程序
    bool ServerRunWndProcess(LPWSTR lpExePath);
    //服务程序启动外部程序 - 管理员身份
    bool serverCreateProcessAsAdmin(string &path);
    bool serverCreateProcessAsAdmin2(string &path);

    bool appCreateProcessAsAdmin(string &path);

    bool StartProcessByPath(string &path);
    bool StopProcessByPath(string &path);

    bool appStartProcessByPath(string &path);
    bool appStopProcessByPath(string &path);
private:
    //cpu数量
//    int processor_count;
    //上一次的时间
//    int64_t last_time;
//    int64_t last_system_time;
      map<unsigned long,LastTime> lastTimeMap;
};

#endif // PROGRESSMANAGE_H
